{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 线程数量误区: 线程创建并非越多越好，需要根据具体场景合理设计数量\n",
    "- 核心问题: 探讨线程池如何解决实时创建/销毁线程的性能问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池\n",
    "\n",
    "- 创建销毁开销:\n",
    "  - 线程创建和销毁是\"重\"操作，涉及内核空间切换（页目录/页表、PCB task struct等）\n",
    "  - 每次操作耗时约1ms级别，频繁操作会显著降低系统实时性能\n",
    "- 内存占用问题:\n",
    "  - 每个线程默认占用8MB栈内存（Linux系统）\n",
    "  - 大量线程会导致内存耗尽，影响正常业务处理\n",
    "- 调度性能损耗:\n",
    "  - 上下文切换消耗CPU时间，线程越多切换开销越大\n",
    "  - 大量线程同时唤醒会导致系统负载锯齿波动，可能引发宕机"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "多线程的优势\n",
    "\n",
    "- IO密集型:\n",
    "  - 适合多线程，IO等待时CPU可执行其他线程任务\n",
    "  - 典型场景：网络通信、文件读写等阻塞操作\n",
    "- CPU密集型:\n",
    "  - 线程数应与CPU核心数匹配，过多线程会导致频繁上下文切换\n",
    "  - 示例：科学计算、图像处理等纯计算任务\n",
    "- 并行优势:\n",
    "  - 多核CPU可真正并行执行多个线程\n",
    "  - 提升CPU利用率，避免核心闲置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线程池的优势\n",
    "\n",
    "- 预创建机制:\n",
    "  - 服务启动时预先创建线程，避免实时创建的开销\n",
    "  - 线程复用率100%，消除重复创建销毁的成本\n",
    "- 任务处理流程:\n",
    "  - 业务到达时直接从池中获取空闲线程\n",
    "  - 任务完成后线程归还池中，不进行销毁\n",
    "- 性能对比:\n",
    "  - 传统方式：创建(1ms)→执行→销毁(1ms)→循环\n",
    "  - 线程池：获取(μs级)→执行→归还(μs级)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "fixed模式线程池\n",
    "\n",
    "- 数量确定原则:\n",
    "  - 通常取CPU核心数，可通过`std::thread::hardware_concurrency()`获取\n",
    "  - C++11默认实现方式，被muduo等网络库采用\n",
    "- 适用场景:\n",
    "  - 任务类型稳定且耗时均匀\n",
    "  - CPU密集型任务的首选方案\n",
    "- 实现特点:\n",
    "  - 线程数量生命周期内保持不变\n",
    "  - 需要合理设置任务队列容量防止堆积"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cached模式线程池\n",
    "\n",
    "- 动态调节机制:\n",
    "  - 初始线程数=CPU核心数\n",
    "  - 任务堆积时自动扩容，上限通常设为1024\n",
    "  - 空闲线程超时60秒自动回收\n",
    "- 设计考量:\n",
    "  - 解决突发流量导致的线程不足问题\n",
    "  - 避免长期维持过多闲置线程\n",
    "- 典型场景:\n",
    "  - 电商秒杀等突发流量场景\n",
    "  - 任务执行时间差异大的混合型业务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "内容总结\n",
    "\n",
    "- 选择策略:\n",
    "  - 常规业务首选fixed模式（默认）\n",
    "  - 存在突发流量时考虑cached模式\n",
    "- 关键数值:\n",
    "  - 动态增长上限：1024线程\n",
    "  - 空闲超时时间：60秒\n",
    "- 实现原则:\n",
    "  - 必须设置线程数量阈值\n",
    "  - 动态线程要及时回收\n",
    "  - 任务队列需要线程安全设计"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
